//第一题
var number = 5;
var obj = {
    number: 3,
    fn1: (function () {
        //this指向为空
        var number;
        this.number *= 2;//10 9 
        number = number * 2;//NaN
        number = 3;
        return function () {
            var num = this.number;//10
            this.number *= 2;//
            console.log("num的值：",num);///
            number *= 3;
            console.log("number的值：",number);//
        }
    })()
}
var fn1 = obj.fn1;//==》没有东西
fn1.call(null);//传null之后this指向window  num:NaN   number：9
obj.fn1();///this指向obj   num：3  number：27
console.log("全局变量：",window.number);//number：20

// //第二题隐式绑定
// function sayHi(){
//     console.log('Hello,', this.name);
// }
// var person = {
//     name: '姓名：Person',
//     sayHi: sayHi
// }
// var name = '全局名字';
// person.sayHi();//hello 姓名：Person

// //第三题  链式绑定
// function sayHi(){
//     console.log('Hello,', this.name);
// }
// var person2 = {
//     name: '姓名Person2',
//     sayHi: sayHi
// }
// var person1 = {
//     name: '姓名Person1',
//     friend: person2
// }
// person1.friend.sayHi();//姓名Person2  找调用的前一位就是他的this

// //第四题
// function sayHi(){
//     console.log('Hello,', this.name);
// }
// var person = {
//     name: 'Person姓名',
//     sayHi: sayHi
// }
// var name = '全局变量';
// var Hi = person.sayHi;
// Hi();//Hello undefind   Hi指向window

// //第五题
// function sayHi(){
//     console.log('Hello,', this.name);
// }
// var person1 = {
//     name: 'Person1的值',
//     sayHi: function(){
//         //this指向的是person1
//         setTimeout(function(){
//             //this指向window
//             console.log('Hello,',this.name);
//         })
//     }
// }
// var person2 = {
//     name: 'Person2的值',
//     sayHi: sayHi
// }
// var name='全局变量name';
// person1.sayHi();//Hello undefined
// setTimeout(person2.sayHi,100);//默认绑定指向window Hello undefined
// setTimeout(function(){
//     person2.sayHi();//this指向person2  Hello Person2的值
// },200);

// //第六题
// function sayHi(){
//     console.log('Hello,', this.name);
// }
// var person = {
//     name: 'Person名字',
//     sayHi: sayHi
// }
// var name = '全局名字';
// var Hi = person.sayHi;
// Hi.call(person);//this指向person  hello person名字

// //第七题
// function sayHi(){
//     console.log('Hello,', this.name);
// }
// var person = {
//     name: 'Person的值',
//     sayHi: sayHi
// }
// var name = '全局的名字';
// var Hi = function(fn) {
//     //this指向person
//     fn();
// }
// Hi.call(person, person.sayHi);//this指向person   hello undefined

// //第八题
// function sayHi(){
//     console.log('Hello,', this.name);
// }
// var person = {
//     name: 'Person的题',
//     sayHi: sayHi
// }
// var name = '全局变量的值';
// var Hi = function(fn) {
//     //this指向person 
//     fn.call(this);//this谁调用的就是谁的
// }
// Hi.call(person, person.sayHi);//this指向person Hello,Person的题

// //第九题 题有问题。。。。。。
// function _new() {
//     let target = {};
//     let [constructor, ...args] = [...arguments];
//     target.__proto__ = constructor.prototype;
//     let result = constructor.apply(target, args);
//     if (result && (typeof (result) == "object" || typeof (result) == "function")) {
//         return result;
//     }
//     return target;
// }
// ///没有调用

// //第十题
// var obj = {
//     hi: function(){
//         console.log(this);
//         return ()=>{
//             console.log(this);
//         }
//     },
//     sayHi: function(){
//         //this指向obj
//         return function() {
//             //this指向window
//             console.log(this);
//             return ()=>{
//             //this指向window
//                 console.log(this);
//             }
//         }
//     },
//     say: ()=>{
//         console.log(this);
//     }
// }
// let hi = obj.hi();//打印 obj对象
// hi();//打印 obj'对象  箭头函数的this在定义时就已经指向obj
// let sayHi = obj.sayHi();
// let fun1 = sayHi();
// fun1();//返回window
// obj.say();//指向{}   没有调用

// //第十一题
// var obj = {
//     hi: function(){
//         console.log(this);
//         return ()=>{
//             console.log(this);
//         }
//     },
//     sayHi: function(){
//         //this指向obj
//         return function() {
//             //this指向window
//             console.log(this);
//             return ()=>{
//             //this指向window
//                 console.log(this);
//             }
//         }
//     },
//     say: ()=>{
//         console.log(this);
//     }
// }
// let sayHi = obj.sayHi();
// let fun1 = sayHi();
// fun1();//指向window
// let fun2 = sayHi.bind(obj)();///返回的函数中this指向obj
// fun2();//打印obj